From bc208753e145a91d311d057793cb99053b165a4a Mon Sep 17 00:00:00 2001 From: "sos22@douglas.cl.cam.ac.uk" Date: Fri, 15 Oct 2004 17:04:44 +0000 Subject: [PATCH] bitkeeper revision 1.1159.1.238 (4170032cpg2cImDyZBh7B0OJ5MVrTg) It turns out that Xen hypercalls actually clobber the registers used to pass in their arguments (some of the time, at least). Correct the asm in hypervisor.h to allow for this. --- BitKeeper/etc/logging_ok | 1 + .../include/asm-xen/hypervisor.h | 182 ++++++++++++------ 2 files changed, 129 insertions(+), 54 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 9ec3ca7ee9..65cb94b67b 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -47,6 +47,7 @@ smh22@boulderdash.cl.cam.ac.uk smh22@labyrinth.cl.cam.ac.uk smh22@tempest.cl.cam.ac.uk smh22@uridium.cl.cam.ac.uk +sos22@douglas.cl.cam.ac.uk sos22@labyrinth.cl.cam.ac.uk tlh20@elite.cl.cam.ac.uk tlh20@labyrinth.cl.cam.ac.uk diff --git a/linux-2.6.8.1-xen-sparse/include/asm-xen/hypervisor.h b/linux-2.6.8.1-xen-sparse/include/asm-xen/hypervisor.h index f625361729..b2ed1c164d 100644 --- a/linux-2.6.8.1-xen-sparse/include/asm-xen/hypervisor.h +++ b/linux-2.6.8.1-xen-sparse/include/asm-xen/hypervisor.h @@ -186,10 +186,13 @@ HYPERVISOR_set_trap_table( trap_info_t *table) { int ret; + unsigned long ignore; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_trap_table), - "b" (table) : "memory" ); + : "=a" (ret), "=b" (ignore) + : "0" (__HYPERVISOR_set_trap_table), "1" (table) + : "memory" ); return ret; } @@ -199,10 +202,14 @@ HYPERVISOR_mmu_update( mmu_update_t *req, int count, int *success_count) { int ret; + unsigned long ign1, ign2, ign3; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_mmu_update), - "b" (req), "c" (count), "d" (success_count) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_mmu_update), "1" (req), "2" (count), + "3" (success_count) + : "memory" ); return ret; } @@ -212,10 +219,13 @@ HYPERVISOR_set_gdt( unsigned long *frame_list, int entries) { int ret; + unsigned long ign1, ign2; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_gdt), - "b" (frame_list), "c" (entries) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_set_gdt), "1" (frame_list), "2" (entries) + : "memory" ); return ret; @@ -226,10 +236,13 @@ HYPERVISOR_stack_switch( unsigned long ss, unsigned long esp) { int ret; + unsigned long ign1, ign2; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_stack_switch), - "b" (ss), "c" (esp) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_stack_switch), "1" (ss), "2" (esp) + : "memory" ); return ret; } @@ -240,11 +253,14 @@ HYPERVISOR_set_callbacks( unsigned long failsafe_selector, unsigned long failsafe_address) { int ret; + unsigned long ign1, ign2, ign3, ign4; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_callbacks), - "b" (event_selector), "c" (event_address), - "d" (failsafe_selector), "S" (failsafe_address) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) + : "0" (__HYPERVISOR_set_callbacks), "1" (event_selector), + "2" (event_address), "3" (failsafe_selector), "4" (failsafe_address) + : "memory" ); return ret; } @@ -266,10 +282,13 @@ HYPERVISOR_yield( void) { int ret; + unsigned long ign; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_sched_op), - "b" (SCHEDOP_yield) : "memory" ); + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_yield) + : "memory" ); return ret; } @@ -279,10 +298,12 @@ HYPERVISOR_block( void) { int ret; + unsigned long ign1; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_sched_op), - "b" (SCHEDOP_block) : "memory" ); + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_sched_op), "1" (SCHEDOP_block) + : "memory" ); return ret; } @@ -292,10 +313,12 @@ HYPERVISOR_shutdown( void) { int ret; + unsigned long ign1; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_sched_op), - "b" (SCHEDOP_shutdown | (SHUTDOWN_poweroff << SCHEDOP_reasonshift)) + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_sched_op), + "1" (SCHEDOP_shutdown | (SHUTDOWN_poweroff << SCHEDOP_reasonshift)) : "memory" ); return ret; @@ -306,10 +329,12 @@ HYPERVISOR_reboot( void) { int ret; + unsigned long ign1; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_sched_op), - "b" (SCHEDOP_shutdown | (SHUTDOWN_reboot << SCHEDOP_reasonshift)) + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_sched_op), + "1" (SCHEDOP_shutdown | (SHUTDOWN_reboot << SCHEDOP_reasonshift)) : "memory" ); return ret; @@ -320,12 +345,15 @@ HYPERVISOR_suspend( unsigned long srec) { int ret; + unsigned long ign1, ign2; + /* NB. On suspend, control software expects a suspend record in %esi. */ __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_sched_op), + : "=a" (ret), "=b" (ign1), "=S" (ign2) + : "0" (__HYPERVISOR_sched_op), "b" (SCHEDOP_shutdown | (SHUTDOWN_suspend << SCHEDOP_reasonshift)), - "S" (srec) : "memory" ); + "S" (srec) : "memory"); return ret; } @@ -337,10 +365,13 @@ HYPERVISOR_set_timer_op( int ret; unsigned long timeout_hi = (unsigned long)(timeout>>32); unsigned long timeout_lo = (unsigned long)timeout; + unsigned long ign1, ign2; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_timer_op), - "b" (timeout_hi), "c" (timeout_lo) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_set_timer_op), "b" (timeout_hi), "c" (timeout_lo) + : "memory"); return ret; } @@ -350,11 +381,14 @@ HYPERVISOR_dom0_op( dom0_op_t *dom0_op) { int ret; + unsigned long ign1; + dom0_op->interface_version = DOM0_INTERFACE_VERSION; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_dom0_op), - "b" (dom0_op) : "memory" ); + : "=a" (ret), "=b" (ign1) + : "0" (__HYPERVISOR_dom0_op), "1" (dom0_op) + : "memory"); return ret; } @@ -364,10 +398,12 @@ HYPERVISOR_set_debugreg( int reg, unsigned long value) { int ret; + unsigned long ign1, ign2; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_debugreg), - "b" (reg), "c" (value) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_set_debugreg), "1" (reg), "2" (value) + : "memory" ); return ret; } @@ -377,10 +413,12 @@ HYPERVISOR_get_debugreg( int reg) { unsigned long ret; + unsigned long ign; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_get_debugreg), - "b" (reg) : "memory" ); + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_get_debugreg), "1" (reg) + : "memory" ); return ret; } @@ -390,10 +428,14 @@ HYPERVISOR_update_descriptor( unsigned long ma, unsigned long word1, unsigned long word2) { int ret; + unsigned long ign1, ign2, ign3; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_update_descriptor), - "b" (ma), "c" (word1), "d" (word2) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_update_descriptor), "1" (ma), "2" (word1), + "3" (word2) + : "memory" ); return ret; } @@ -403,10 +445,13 @@ HYPERVISOR_set_fast_trap( int idx) { int ret; + unsigned long ign; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_set_fast_trap), - "b" (idx) : "memory" ); + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_set_fast_trap), "1" (idx) + : "memory" ); return ret; } @@ -417,11 +462,14 @@ HYPERVISOR_dom_mem_op( unsigned long nr_extents, unsigned int extent_order) { int ret; + unsigned long ign1, ign2, ign3, ign4, ign5; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_dom_mem_op), - "b" (op), "c" (extent_list), "d" (nr_extents), "S" (extent_order), - "D" (DOMID_SELF) + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4), + "=D" (ign5) + : "0" (__HYPERVISOR_dom_mem_op), "1" (op), "2" (extent_list), + "3" (nr_extents), "4" (extent_order), "5" (DOMID_SELF) : "memory" ); return ret; @@ -432,10 +480,13 @@ HYPERVISOR_multicall( void *call_list, int nr_calls) { int ret; + unsigned long ign1, ign2; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_multicall), - "b" (call_list), "c" (nr_calls) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_multicall), "1" (call_list), "2" (nr_calls) + : "memory" ); return ret; } @@ -445,10 +496,14 @@ HYPERVISOR_update_va_mapping( unsigned long page_nr, pte_t new_val, unsigned long flags) { int ret; + unsigned long ign1, ign2, ign3; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_update_va_mapping), - "b" (page_nr), "c" ((new_val).pte_low), "d" (flags) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_update_va_mapping), + "1" (page_nr), "2" ((new_val).pte_low), "3" (flags) + : "memory" ); if ( unlikely(ret < 0) ) { @@ -465,10 +520,12 @@ HYPERVISOR_event_channel_op( void *op) { int ret; + unsigned long ignore; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_event_channel_op), - "b" (op) : "memory" ); + : "=a" (ret), "=b" (ignore) + : "0" (__HYPERVISOR_event_channel_op), "1" (op) + : "memory" ); return ret; } @@ -478,10 +535,13 @@ HYPERVISOR_xen_version( int cmd) { int ret; + unsigned long ignore; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_xen_version), - "b" (cmd) : "memory" ); + : "=a" (ret), "=b" (ignore) + : "0" (__HYPERVISOR_xen_version), "1" (cmd) + : "memory" ); return ret; } @@ -491,10 +551,12 @@ HYPERVISOR_console_io( int cmd, int count, char *str) { int ret; + unsigned long ign1, ign2, ign3; __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_console_io), - "b" (cmd), "c" (count), "d" (str) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_console_io), "1" (cmd), "2" (count), "3" (str) + : "memory" ); return ret; } @@ -504,10 +566,13 @@ HYPERVISOR_physdev_op( void *physdev_op) { int ret; + unsigned long ign; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_physdev_op), - "b" (physdev_op) : "memory" ); + : "=a" (ret), "=b" (ign) + : "0" (__HYPERVISOR_physdev_op), "1" (physdev_op) + : "memory" ); return ret; } @@ -517,10 +582,13 @@ HYPERVISOR_grant_table_op( unsigned int cmd, void *uop, unsigned int count) { int ret; + unsigned long ign1, ign2, ign3; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_grant_table_op), - "b" (cmd), "c" (count), "d" (uop) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3) + : "0" (__HYPERVISOR_grant_table_op), "1" (cmd), "2" (count), "3" (uop) + : "memory" ); return ret; } @@ -530,10 +598,13 @@ HYPERVISOR_update_va_mapping_otherdomain( unsigned long page_nr, pte_t new_val, unsigned long flags, domid_t domid) { int ret; + unsigned long ign1, ign2, ign3, ign4; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_update_va_mapping_otherdomain), - "b" (page_nr), "c" ((new_val).pte_low), "d" (flags), "S" (domid) : + : "=a" (ret), "=b" (ign1), "=c" (ign2), "=d" (ign3), "=S" (ign4) + : "0" (__HYPERVISOR_update_va_mapping_otherdomain), + "1" (page_nr), "2" ((new_val).pte_low), "3" (flags), "4" (domid) : "memory" ); return ret; @@ -544,10 +615,13 @@ HYPERVISOR_vm_assist( unsigned int cmd, unsigned int type) { int ret; + unsigned long ign1, ign2; + __asm__ __volatile__ ( TRAP_INSTR - : "=a" (ret) : "0" (__HYPERVISOR_vm_assist), - "b" (cmd), "c" (type) : "memory" ); + : "=a" (ret), "=b" (ign1), "=c" (ign2) + : "0" (__HYPERVISOR_vm_assist), "1" (cmd), "2" (type) + : "memory" ); return ret; } -- 2.30.2